#include<iostream>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

using namespace std;

void signalHandler(int sig)
{
    int n=alarm(5);
    if (n == 0)
    {
        cout << "Alarm was not set." << endl;
    }
    else
    {
        cout << "Alarm was set to go off in " << n << " seconds." << endl;
    }
    cout << "Signal " << sig << " received." << endl;
}

void test1()
{
    //处理信号的三种方式
    signal(SIGINT, signalHandler); //signal(SIGINT, NULL); 空指针等于没有更改处理方式，还是默认动作
    signal(SIGINT,SIG_IGN); // 忽略SIGINT信号
    signal(SIGINT,SIG_DFL); // 恢复SIGINT信号的默认处理方式
    while(1)
    {
        cout<<"Running... Press Ctrl+C to send SIGINT." << endl;
        sleep(1);
    }
}

void print(sigset_t *set)
{
    for(int i=32;i>=1;i--)
    {
        if(i%4==0) cout<<" ";
        if(sigismember(set, i)) cout<<1;
        else cout<<0;
    }
    cout << endl;
}

void signalhandler(int sig)
{
    cout << "Signal " << sig << " received." << endl;
}
void test2()
{
    sigset_t set,oset,pset;
    //练习使用各种信号集操作函数
    signal(SIGINT, signalhandler); 
    sigemptyset(&set); // 初始化信号集为空
    sigemptyset(&oset); // 初始化另一个信号集为空
    sigemptyset(&pset); // 初始化第三个信号集为空
    sigaddset(&set, 2); // 将SIGINT信号添加到信号集中
    int n=sigprocmask(SIG_SETMASK, &set, &oset); // 将set信号集中的信号阻塞，并将之前的阻塞信号集保存到oset中
    if(n == -1)
    {
        perror("sigprocmask");
        return;
    }
    int cnt=0;
    while(1)
    {
        int n=sigpending(&pset); // 获取当前进程的未决信号集
        if(n == -1)
        {
            perror("sigpending");
            return;
        }
        print(&pset); // 打印未决信号集
        cnt++;
        if(cnt==10)
        {
            int m=sigprocmask(SIG_SETMASK, &oset, nullptr); // 恢复之前的阻塞信号集
            if(m == -1)
            {
                perror("sigprocmask");
                return;
            }
        }
        sleep(1);
    }
}

int main()
{
    test2();
    return 0;  
}

